﻿#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

//结构成员访问操作符struct
//struct student
//{
//	char name[10];
//	int age;
//	int high;
//	float weigh;//float定义的输入值最后需要加f，不然系统会定义为double类型
//	char id[16];
//}s2;//全局的,已定义学生s2各项指标为0
//
//struct student s3;//全局的
//
////int main()
////{
////	struct student s1 = { "张三",20,NULL,60.5f,"202402220001" };//局部的,NULL表示空着，不取值
////	struct student s4 = { .age = 24,.name = "李四",.high = 160,.weigh = 50.5f,.id = "202402220002" };
////	printf("%s %d %d %.1f %s\n", s1.name, s1.age, s1.high, s1.weigh, s1.id);
////	printf("%s %d %d %.1f %s\n", s4.name, s4.age, s4.high, s4.weigh, s4.id);//通过操作符(.)直接访问
////	return 0;
////}
//
//struct family
//{
//	char f_name[10];
//	char m_name[10];
//	struct student s5;//结构体嵌套
//	int money;
//}m1 = { "张四","李三",{"张丽",18,165,50,45.5f,NULL},NULL };
//
//int main()
//{
//	printf("%s %s %s %d", m1.f_name, m1.m_name, m1.s5.name, m1.money);//注意m1.s5.name
//	return 0;
//}




//整型提升
//int main()
//{
//	printf("%d\n", sizeof(char));//1个字节
//	printf("%d\n", sizeof(int));//4个字节
//	char a = 3;		//00000011
//	char b = 127;	//01111111
//	char c = a + b;
//					//10000010(char类型下储存的数据)
//	//11111111111111111111111110000010(补码)，将char转为int
//	//10000000000000000000000001111110(原码，-126)
//	printf("%d\n", c);//%d打印int类型
//	return 0;
//}




//问题表达式解析
// 
//int main()
//{
//	int c = 5;
//	c + --c;
//}
//我们只知道--云散是在+运算之前
//但右边--c之后是4，c被赋值为4，左边c是4还是5？有歧义

//int main()
//{
//	a * b + b * c + c * d;
//}
//我们知道*运算是在+运算之前
//但第一个+是在第三格*之后吗？

//int fun()
//{
//	static int count = 1;
//	return ++count;
//}
//int main()
//{
//	int n = 0;
//	n = fun() - fun() * fun();//2 - 3 * 4 = -10
//	//我们只能得出先算*再算-
//  //但是不能得知fun()调用顺序(也就是从左往右，还是按照使用顺序进行调用)
//  //明显这里是从左往右进行调用的
//  //明明*运算先进行，为啥不是4 - 2 * 3 = -2 ?
//	printf("%d\n", n);
//	return 0;
//}

//int main()
//{
//	int i = 1;
//	int ret = (++i) + (++i) + (++i);//++i的意思是先对i进行+1,使i变成(i+1)后再使用i(i+1)
//	printf("%d\n", ret);//4 + 4 + 4 = 12
//	//在小熊猫C++上是2 + 3 + 4 = 10
//	printf("%d\n", i);
//	return 0;
//}




//指针变量和地址
//int main()
//{
//	int a = 10;
//	printf("%p\n", &a);//%p打印地址，&取地址
//	int* p = &a;//*两边有没有空格不影响，int*专门定义地址(方便理解)
//	printf("%p\n", p);
//	int t = *p;//*解引用操作符
//	printf("%d\n", t);
//
//	//a == *&a;//*与&的关系
//
//	return 0;
//}
//int main()
//{
//	char a = 'w';
//	char* b = &a;
//	printf("%p\n", &a);
//	printf("%p\n", b);
//
//	printf("%zd\n", sizeof(int*));//%zd专门打印sizeof返回值的
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(float*));
//	printf("%zd\n", sizeof(double*));
//	printf("%zd\n", sizeof(short*));//在x86系统下每个地址都占用4个字节，在x64系统下占用8个字节
//
//	return 0;
//}//同上不多解释


//指针变量类型的意义
int main()
{
	int n = 0x11223344;
	//指针的类型决定了，对指针解引⽤的时候有多⼤的权限(一次能访问多少个字节)
	int* p1 = &n;
	*p1 = 0;//int* 的指针的解引⽤就能访问四个字节，调试时将4个字节变为0
	char* p2 = (char*)&n;
	*p2 = 0;//char* 的指针的解引⽤就能访问一个字节，调试时将44（1个字节）变为0

	printf("p1  =%p\n",p1);
	printf("p1+1=%p\n",p1+1);//+1之后地址增加了4个字节，可以理解为int*类型占用4个字节，+1跳跃一个int*
	printf("p2  =%p\n",p2);
	printf("p2+1=%p\n",p2+1);//同上跳跃了1个字节           

	return 0;
}

